package cn.datastruct.four;
/*
* 时间：2021/2/17编写
* 复习：
* */
/*
    链表结构：
        1，排名
        2，名字
        3，别名
        4,构造器
* */
//构造LinkedNode类型的数据类型
class LinkedNode {
    public int No;
    public String name;
    public String alias;
    public LinkedNode next;

    public LinkedNode(int no, String name, String alias) {
        No = no;
        this.name = name;
        this.alias = alias;
    }

    public LinkedNode() {
    }

    @Override
    public String toString() {
        return "LinkedNode{" +
                "No=" + No +
                ", name='" + name + '\'' +
                ", alias='" + alias + '\'' +
                '}';
    }
}

/*
    1,构造链表头，链表头不存放数据
    2,add(LinkedNode ln),添加链表节点
    3，addByOrder(LinkedNode ln),按照排序添加链表节点
    4，del,删除链表节点
    5，打印链表
* */
public class singleLinkedList {
    LinkedNode ll;

    //构造函数
    public singleLinkedList() {
        this.ll = new LinkedNode(0, "", "");
    }

    //到末尾添加链表节点
    public void addNode(LinkedNode ln) {
        //添加节点需要借助辅助节点找到最后一个节点
        LinkedNode temp = this.ll;
        while (temp.next != null) {
            temp = temp.next;
        }
        temp.next = ln;
    }

    //3，addByorder(LinkedNode ln),按照排序添加链表节点
    public void addByOrder(LinkedNode ln) {
        //添加节点,需要借助辅助节点找到节点位置
        LinkedNode temp = this.ll;
        while (temp.next != null && temp.next.No < ln.No) {
            temp = temp.next;
        }
        if (temp.next == null || temp.next.No > ln.No) {
            LinkedNode item = temp.next;
            temp.next = ln;
            ln.next = item;
        } else if (temp.next.No == ln.No) {
            System.out.println("此编号已有数据插入，添加元素失败");
        }
    }

    public void del(LinkedNode ln) {
        //添加节点,需要借助辅助节点找到节点位置
        LinkedNode temp = this.ll;
        if (temp.next == null) {
            System.out.println("链表为空，删除失败");
        }
        while (temp.next != null && temp.next.No != ln.No) {
            temp = temp.next;
        }
        if (temp.next == null) {
            System.out.println("不存在该元素，删除失败");
        } else if (temp.next.No == ln.No) {
            temp.next = temp.next.next;
        }
    }

    public void showLinkedNode() {
        LinkedNode temp = this.ll.next;
        if (temp == null)
            System.out.println("链表为空");
        else {
            while (temp != null) {
                System.out.println(temp);
                temp = temp.next;
            }
        }
    }
}
/**
 单链表总结：
    1，写一个类来定义一个新的数据类型（链表节点）
        1.1，刚开始是没有一点思路，网上看了下教程，要定义成员，还有定义构造器
        1.2，重写toString()函数，不然打印的是地址
    2，写一个链表类
        2.1，一个头节点，不包含链表信息，只用来做指向链表的地址
        2.2，add(),在末尾添加元素
        2.3，addByOrder(),根据No添加元素，刚刚开始是搞不清指针指向的东西，有点乱。还有为什么会是降序排序
        2.4，del(),特别注意野指针
 ***要时刻注意指向的内容，不然一不小心就来个bug,要熟悉过程
 *
 */

